/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nextel.project.cobranza;

import com.nextel.project.Configuracion;
import com.nextel.project.agps.ControlAgps;
import com.nextel.project.cliente.ControlCliente;
import com.nextel.project.cobranza.bean.CobranzaBean;
import com.nextel.project.cobranza.bean.PagoBean;
import com.nextel.project.cobranza.mvc.MVCFinCobranza;
import com.nextel.project.cobranza.mvc.MVCIngresarDocumento;
import com.nextel.project.cobranza.mvc.MVCIngresarMonto;
import com.nextel.project.cobranza.mvc.MVCListaBanco;
import com.nextel.project.cobranza.mvc.MVCListaCobranza;
import com.nextel.project.cobranza.mvc.MVCTipoPago;
import com.nextel.project.cobranza.rms.RMSBanco;
import com.nextel.project.cobranza.rms.RMSCobranza;
import com.nextel.project.cobranza.rms.RMSPago;
import com.nextel.project.dao.HttpControl;
import com.nextel.project.dao.XMLDAO;
import com.nextel.project.pedido.ControlPedido;
import com.nextel.project.usuario.ControlUsuario;
import pe.com.nextel.main.ControlBase;
import java.io.InputStream;
import javax.microedition.io.HttpConnection;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.Fecha;
import pe.com.nextel.util.List;
import pe.com.nextel.util.math.MathUtil;
import pe.com.nextel.util.StringUtils;

/**
 *
 *
 */
public class ControlCobranza extends ControlBase {
    
    private static final ControlCobranza control = new ControlCobranza();
    //current
    public PagoBean currentPago;
    public CobranzaBean currentCobranza;
    //rms
    public final RMSCobranza rmsCobranza = new RMSCobranza();
    public final RMSPago rmsPago = new RMSPago();
    public final RMSBanco rmsBanco = new RMSBanco();
    //dalvarez
    public final MVCListaBanco mvcListaBanco = new MVCListaBanco();
    public final MVCListaCobranza mvcListaCobranza = new MVCListaCobranza();
    public final MVCIngresarMonto mvcIngresarMonto = new MVCIngresarMonto();
    public final MVCTipoPago mvcTipoPago = new MVCTipoPago();
    public final MVCIngresarDocumento mvcIngresarDocumento = new MVCIngresarDocumento();
    public final MVCFinCobranza mvcFinCobranza = new MVCFinCobranza();
    
    //hilos
    public static final byte COBRANZA = 4;
    private byte busquedaMVC = 4;
    private byte busquedaMVCT = 5;
    public Thread threadBusqueda;
    
    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlCobranza getInstance() {
        return control;
    }
    
    /**
     * para no crear mas instancias
     */
    private ControlCobranza() {
    }
    
    /*****************************************************************************/
    /********************LOGICA DE NEGOCIO **************************************/
    /*****************************************************************************/
    public void joinThreadBusqueda() {
        try {
            if (threadBusqueda != null && threadBusqueda.isAlive()) {
                threadBusqueda.join();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public List listarCobranzarCliente(String codigoCliente) {
        try {
            
            return rmsCobranza.getListaCobranzaPorCliente(codigoCliente);
            
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());
        }
        return null;
    }
    
    public void iniciarCobranza(CobranzaBean cobranza) {
//        System.out.println("iniciarCobranza");
        try {
            limpiarMemoria();
            
            currentCobranza = cobranza;
            currentPago = new PagoBean();
            if("1".equals(ControlUsuario.getInstance().currentUsuario.gps)){
                if (ControlAgps.getInstance().currentGPS != null) {
                    currentPago.latitud = ControlAgps.getInstance().currentGPS.getLatitude();
                    currentPago.longitud = ControlAgps.getInstance().currentGPS.getLongitude();
                }
            }
            // Seteamos los valores fisicos y logicos de RecordCobranza al RecordPago
            // para hacer mas facil y rapida la actualizacion de los montos en la cobranza
            if (cobranza != null) {
                currentPago.setRecordIDCobranza(currentCobranza.getIdRecodset());
                currentPago.setPosicionIDCobranza(currentCobranza.getPosicionID());
            }
            currentPago.setFechMobil(Fecha.getDate().getTime());
            
            setCurrent(mvcIngresarMonto.showScreen());
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, mvcListaCobranza.showScreen());
        }
    }
    
    public void modificarCobranza(PagoBean pago) {
        try {
            limpiarMemoria( );
            currentPago = pago;
            if (pago != null && pago.getRecordIDCobranza() > 0) {
                currentCobranza = (CobranzaBean) rmsCobranza.getObject(pago.getRecordIDCobranza(), pago.getPosicionIDCobranza());
            }
        } catch (Exception e) {
            showError("Error : " + e, mvcListaCobranza.showScreen());
        }
    }
    
    public List getListarBanco() {
        try {
            return rmsBanco.getAllLista();
        } catch (Exception e) {
            showError("Error : " + e, mvcListaCobranza.showScreen());
        }
        return null;
    }
    
    
    /**
     * Realiza el pago
     * @param navigate
     */
    public void grabarPago() {
        try {
            
            if("1".equals(ControlUsuario.getInstance().currentUsuario.gps)){
                if (ControlAgps.getInstance().currentGPS != null) {
                   currentPago.latitud = ControlAgps.getInstance().currentGPS.getLatitude();
                    currentPago.longitud = ControlAgps.getInstance().currentGPS.getLongitude();
                }
            }
            
            
            
            if( !ControlCliente.getInstance().currentCliente.isEnLinea() ) {
                ControlCliente.getInstance().currentCliente.setEstado(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_VISITADO));//"Visitado"
                ControlCliente.getInstance().rmsCliente.actualizarObjectLista(ControlCliente.getInstance().currentCliente);
            }
            
            
            
            this.incrementarKpiCobranza();
            
            currentCobranza.setMontoPagado(MathUtil.sumar(currentCobranza.getMontoPagado(), currentPago.getMontoPago()));
            
            currentCobranza.setSaldo(MathUtil.restar(currentCobranza.getSaldo(), currentPago.getMontoPago()));
            
            ControlCliente.getInstance().currentCliente.setDeuda( MathUtil.restar(ControlCliente.getInstance().currentCliente.getDeuda(), currentPago.getMontoPago()) );
            
            //System.out.println("");
            ControlCliente.getInstance().actualizarCliente(ControlCliente.getInstance().currentCliente);
            
            // actualizamos las cobranzas con el monto actualizado
            // grabamos el pago
            
            rmsCobranza.actualizarObjectLista(currentCobranza);
            currentPago.setCodigoCobranza(currentCobranza.getCodigo());
            currentPago.setFechaRegistro(Fecha.getFechaActualCompleta());
            currentPago.setCompania(ControlUsuario.getInstance().currentUsuario.getCompania());
            currentPago.setCodigoVendedor(ControlUsuario.getInstance().currentUsuario.getCodigo());
            currentPago.setCodigoCliente(ControlCliente.getInstance().currentCliente.getCodigo());
            
            rmsPago.grabarPago(currentPago);
            
            this.enviarPago();
            
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error: " + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());
        }
    }
    
    public void enviarPago()throws Exception {
        
        System.out.println("Ingreso a Enviar Pagos");
        if(!StringUtils.withSignal()) {
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOCOBERTURA_ENVIO), ControlCliente.getInstance().mvcClienteDetalle.showScreen() );//"Zona sin cobertura, procesar el env\u00EDo mediante la opci\u00F3n ENVIOS del menu principal"
            return;
        }        
        this.enviarPagoFun();
        
    }

    public void enviarPagoTotal() throws Exception
    {

        if(!StringUtils.withSignal()) {
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOCOBERTURA_ENVIO), ControlUsuario.getInstance().mvcEnvio.showScreen() );//"Zona sin cobertura, procesar el env\u00EDo mediante la opci\u00F3n ENVIOS del menu principal"
            return;
        }
        this.enviarPagoFun();

    }


    public void enviarPagoFun() throws Exception
    {
        List listapendientes = rmsPago.getAllBean();

        getMensajeHttp().setTipoEnvio(HttpConnection.POST);
        getMensajeHttp().setUrl(Configuracion.URL_ENVIO_COBRANZA);

        getMensajeHttp().setMensaje(XMLDAO.getInstance().writeXMLPago(listapendientes).getBytes());

        System.out.println("url =" + Configuracion.URL_ENVIO_COBRANZA);
        System.out.println("data =" + XMLDAO.getInstance().writeXMLPago(listapendientes));

        HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_PAGO);
        iniciarConexionHTTP();
    }



    
    public void actualizarPago(InputStream in) {
        //#debug
        System.out.println("actualizarPago");
        
        try {
            XMLDAO.getInstance().parseMensajeXML(in);
            rmsPago.deleteAll();
            limpiarMemoria( );
            
            if(ControlCliente.getInstance().currentCliente != null){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_PAGO_REGISTRADO), ControlCliente.getInstance().mvcClienteDetalle.showScreen());//"Pago registrado"
            }else if (busquedaMVC == COBRANZA){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_PAGO_REGISTRADO), ControlUsuario.getInstance().mvcEnvio.showScreen());//"Pago registrado"
            }
        } catch (Exception e) {
            e.printStackTrace();
            
            if(ControlCliente.getInstance().currentCliente != null){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOATENDIO_PEDIDO)+": " + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());//"No se pudo atender el pedido"
            }else if (busquedaMVC == COBRANZA){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOATENDIO_PEDIDO)+": " + e, ControlUsuario.getInstance().mvcEnvio.showScreen());//"No se pudo atender el pedido"
            }
        }
    }
    
    public void eliminarDatos()throws Exception{
        rmsBanco.deleteAll();
        rmsCobranza.eliminar();
        rmsPago.eliminar();
    }
    
    public void limpiarMemoria( ){
        
        if(currentPago != null){
            currentPago.clear();
            currentPago = null;
        }
        
        if(currentCobranza != null){
            currentCobranza.clear();
            currentCobranza = null;
        }
    }
    
    public void incrementarKpiCobranza()throws Exception{
        ControlPedido.getInstance().currentKPI.montoCobrado =  MathUtil.sumar(ControlPedido.getInstance().currentKPI.montoCobrado, currentPago.getMontoPago( ));
        ControlPedido.getInstance().rmsKPI.guardarKPI(ControlPedido.getInstance().currentKPI);
    }
    
    public int getNumeroPagosPendientes() {
        
        int total = 0;
        try {
            List lst = getPagosPendientes();
            if ((lst != null) && (lst.size() >= 0)) {
                total = lst.size();
            }
                    
        } catch (Exception e) {
            e.printStackTrace();
            total = 0;
        }
        
        return total;
        
    }    
    
    public List getPagosPendientes() {
        try {
            return rmsPago.getAllBean();
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e,  ControlCliente.getInstance().mvcClienteDetalle.showScreen());
        }
        return null;
    }
    
    public byte getBusquedaMVC() {
        return busquedaMVC;
    }
    
    public void setBusquedaMVC(byte busquedaMVC) {
        this.busquedaMVC = busquedaMVC;
    }
    public byte getBusquedaMVCT() {
        return busquedaMVCT;
    }
    
    public void setBusquedaMVCT(byte busquedaMVCT) {
        this.busquedaMVCT = busquedaMVCT;
    }
}
